From c4a1f6ddede959b6ab2736dbe00e646fffa193cf Mon Sep 17 00:00:00 2001 From: robertl Date: Tue, 21 Sep 2010 18:11:38 +0000 Subject: [PATCH] Alex York enhances MMO to handle European Edition, Version 5.4.2. --- mmo.c | 167 +- reference/memory-map_v24.mmo | Bin 0 -> 25013 bytes reference/memory-map_v24~mmo.gpx | 2781 ++++++++++++++++++++++++++++++ testo.d/classic-4.test | 5 +- 4 files changed, 2918 insertions(+), 35 deletions(-) create mode 100644 reference/memory-map_v24.mmo create mode 100644 reference/memory-map_v24~mmo.gpx diff --git a/mmo.c b/mmo.c index c8d1b4330..d2ac2f77c 100644 --- a/mmo.c +++ b/mmo.c @@ -33,6 +33,8 @@ * 0x12 - most files in my test pool :-) 2008/11/19: Fix routes with a loop but different start and end point 2008/12/12: Fix object release error + 2010/09/10: Added read support for version 0x18 + (test file created by Memory-Map European Edition, Version 5.4.2, Build 1089). */ #include @@ -133,6 +135,12 @@ static const mmo_icon_mapping_t mmo_icon_value_table[] = { { -1, NULL } }; +static const gbuint32 obj_type_ico = 0x00; +static const gbuint32 obj_type_rte = 0x14; +static const gbuint32 obj_type_trk = 0x1E; +static const gbuint32 obj_type_txt = 0x32; +static const gbuint32 obj_type_wpt = 0x3C; + /* helpers */ #ifdef MMO_DBG @@ -250,8 +258,17 @@ mmo_get_object(const gbuint16 objid) mmo_data_t *data; snprintf(key, sizeof(key), "%d", objid | 0x8000); - if (! avltree_find(objects, key, (void *)&data)) + if (! avltree_find(objects, key, (void *)&data)) { +#ifdef MMO_DBG + gbfseek(fin, -2, SEEK_CUR); + int ni, n; + for (ni = 0; (n = gbfgetc(fin)) != EOF; ni++) { + DBG(("mmo_get_object", "%04X %02X %c (%d)\n", + ni, n, n >= 32 && n <= 126 ? (char)n : '.', n)); + } +#endif fatal(MYNAME ": Unregistered object id 0x%04X!\n", objid | 0x8000); + } return data; } @@ -317,6 +334,7 @@ mmo_end_of_route(mmo_data_t *data) rte->line_color.opacity = 255 - (buf[6] * 51); DBG((sobj, "color = 0x%06X\n", rte->line_color.bbggrr)); DBG((sobj, "transparency = %d (-> %d)\n", buf[6], rte->line_color.opacity)); + DBG((sobj, "for \"%s\" \n", data->name)); } if (rte->rte_waypt_ct == 0) { /* don't keep empty routes */ @@ -334,6 +352,7 @@ mmo_read_category(mmo_data_t *data) if (marker & 0x8000) { mmo_data_t *tmp; + DBG(("mmo_read_category", "reading category object\n")); gbfseek(fin, -2, SEEK_CUR); tmp = mmo_read_object(); if (data) data->category = tmp->name; @@ -347,22 +366,41 @@ mmo_read_CObjIcons(mmo_data_t *data) #ifdef MMO_DBG const char *sobj = "CObjIcons"; #endif - int i; + int icon_id; DBG((sobj, ":-----------------------------------------------------\n")); DBG((sobj, "name = \"%s\" [ visible=%s, id=0x%04X ]\n", data->name, data->visible ? "yes" : "NO", data->objid)); - gbfseek(fin, 6, SEEK_CUR); /* skip 6 unknown bytes */ - - while ((i = gbfgetuint32(fin))) { + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X\n", u16)); + + while ((icon_id = gbfgetuint32(fin))) { char *name; (void) gbfgetuint32(fin); (void) gbfgetuint32(fin); name = mmo_readstr(); -// DBG((sobj, "bitmap(%d) = \"%s\"\n", i, name)); - mmo_register_icon(i, name); + DBG((sobj, "bitmap(0x%08X) = \"%s\"\n", icon_id, name)); + mmo_register_icon(icon_id, name); xfree(name); + // The next four bytes hold the length of the image, + // read them and then skip the image data. gbfseek(fin, gbfgetuint32(fin), SEEK_CUR); } } @@ -393,6 +431,18 @@ mmo_read_CObjWaypoint(mmo_data_t *data) if (! time) time = data->ctime; if (time > 0) wpt->creation_time = time; + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + wpt->latitude = gbfgetdbl(fin); wpt->longitude = gbfgetdbl(fin); @@ -447,6 +497,11 @@ mmo_read_CObjWaypoint(mmo_data_t *data) wpt->wpt_flags.icon_descr_is_dynamic = 1; DBG((sobj, "icon = \"%s\"\n", wpt->icon_descr)); } +#ifdef MMO_DBG + else { + DBG((sobj, "icon not found for 0x%08X\n", i)); + } +#endif } wpt->proximity = le_read_float(&buf[4]); @@ -492,6 +547,18 @@ mmo_read_CObjRoute(mmo_data_t *data) rte->rte_name = xstrdup(data->name); route_add_head(rte); + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + ux = gbfgetc(fin); /* line label */ DBG((sobj, "line label = %d\n", ux)); @@ -509,6 +576,7 @@ mmo_read_CObjRoute(mmo_data_t *data) while (data->left > 0) { mmo_data_t *tmp; + DBG((sobj, "read next waypoint\n")); tmp = mmo_read_object(); if (tmp && tmp->data && (tmp->type = wptdata)) { waypoint *wpt; @@ -549,6 +617,18 @@ mmo_read_CObjTrack(mmo_data_t *data) trk->rte_name = xstrdup(data->name); track_add_head(trk); + if (mmo_version >= 0x18) { + gbuint16 u16; + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + u16 = gbfgetuint16(fin); + DBG((sobj, "unknown value = 0x%04X (since 0x18)\n", u16)); + } + tp = gbfgetint16(fin); DBG((sobj, "track has %d point(s)\n", tp)); @@ -560,7 +640,9 @@ mmo_read_CObjTrack(mmo_data_t *data) wpt->latitude = gbfgetdbl(fin); wpt->longitude = gbfgetdbl(fin); + DBG((sobj, "coordinates = %f / %f\n", wpt->latitude, wpt->longitude)); unk = gbfgetc(fin); + DBG((sobj, "Unknown = 0x%02X (%d)\n", unk, unk)); wpt->creation_time = gbfgetint32(fin); wpt->altitude = gbfgetflt(fin); @@ -568,11 +650,11 @@ mmo_read_CObjTrack(mmo_data_t *data) if (unk != 0) { gbuint16 ux; ux = gbfgetuint16(fin); - DBG((sobj, "u16 = %04X (%d)\n", ux, ux)); + DBG((sobj, "unknown value = 0x%04X (%d)\n", ux, ux)); if (unk > 1) { gbuint16 ux; ux = gbfgetuint16(fin); - DBG((sobj, "u16 = %04X (%d)\n", ux, ux)); + DBG((sobj, "unknown value = 0x%04X (%d)\n", ux, ux)); } } track_add_wpt(trk, wpt); @@ -584,15 +666,15 @@ mmo_read_CObjTrack(mmo_data_t *data) u32 = gbfgetuint32(fin); /* Min. update interval */ DBG((sobj, "min. update interval = %d\n", u32)); u32 = gbfgetuint32(fin); /* unknown */ -// DBG((sobj, "unknown value = 0x%8X (%d)\n", u32, u32)); + DBG((sobj, "unknown value = 0x%08X (%d)\n", u32, u32)); u32 = gbfgetuint32(fin); /* unknown */ -// DBG((sobj, "unknown value = 0x%8X (%d)\n", u32, u32)); + DBG((sobj, "unknown value = 0x%08X (%d)\n", u32, u32)); u32 = gbfgetuint32(fin); /* unknown */ DBG((sobj, "min. update distance = %d\n", u32)); u32 = gbfgetuint32(fin); /* unknown */ DBG((sobj, "track partition interval = %d\n", u32 / 60)); u32 = gbfgetuint32(fin); /* unknown */ -// DBG((sobj, "unknown value = 0x%8X (%d)\n", u32, u32)); + DBG((sobj, "unknown value = 0x%08X (%d)\n", u32, u32)); u32 = gbfgetuint32(fin); /* unknown */ DBG((sobj, "tick interval = %d\n", u32 / 60)); trk->line_color.bbggrr = gbfgetuint32(fin); /* rgb color */ @@ -616,11 +698,11 @@ mmo_read_CObjTrack(mmo_data_t *data) gbuint16 u16; u8 = gbfgetc(fin); -// DBG((sobj, "u8 = 0x%X (since 0x16)\n", u8)); + DBG((sobj, "unknown value = 0x%02X (since 0x16)\n", u8)); u16 = gbfgetuint16(fin); -// DBG((sobj, "u16 = 0x%X (since 0x16)\n", u16)); + DBG((sobj, "unknown value = 0x%04X (since 0x16)\n", u16)); u16 = gbfgetuint16(fin); -// DBG((sobj, "u16 = 0x%X (since 0x16)\n", u16)); + DBG((sobj, "unknown value = 0x%04X (since 0x16)\n", u16)); } } @@ -699,9 +781,14 @@ mmo_read_object(void) int objid; mmo_data_t *data = NULL; + // There are three cases: + // a new object of a type that has not occurred previously in this file; + // a new object; or + // a back reference to an object that appears earlier in the file. + objid = gbfgetuint16(fin); - DBG(("mmo_read_object", "objid = 0x%04X\n", objid)); if (objid == 0xFFFF) { + DBG(("mmo_read_object", "Registering new object type\n")); gbuint16 version; char *sobj; int len; @@ -716,6 +803,7 @@ mmo_read_object(void) sobj = xmalloc(len + 1); sobj[len] = '\0'; gbfread(sobj, len, 1, fin); + DBG(("mmo_read_object", "%s\n", sobj)); if (strcmp(sobj, "CObjIcons") == 0) ico_object_id = objid; else if (strcmp(sobj, "CCategory") == 0) cat_object_id = objid; @@ -729,8 +817,9 @@ mmo_read_object(void) xfree(sobj); } - if (objid & 0x8000) { + DBG(("mmo_read_object", "objid = 0x%04X\n", objid)); + if (objid & 0x8000) { data = mmo_register_object(mmo_object_id++, NULL, 0); data->name = mmo_readstr(); @@ -739,10 +828,25 @@ mmo_read_object(void) data->mtime = gbfgetuint32(fin); data->locked = gbfgetc(fin); data->visible = gbfgetc(fin); - (void) gbfgetuint16(fin); - (void) gbfgetuint16(fin); - + + gbuint32 obj_type; + obj_type = gbfgetuint32(fin); +#ifdef MMO_DBG + gbuint32 expected_type = 0xFFFFFFFF; + if (objid == ico_object_id) expected_type = obj_type_ico; + else if (objid == trk_object_id) expected_type = obj_type_trk; + else if (objid == wpt_object_id) expected_type = obj_type_wpt; + else if (objid == rte_object_id) expected_type = obj_type_rte; + else if (objid == txt_object_id) expected_type = obj_type_txt; + if (mmo_version >= 0x18) expected_type <<= 24; + DBG(("mmo_read_object", "object type = 0x%08X\n", obj_type)); + if (obj_type != expected_type) + DBG(("mmo_read_object", " expected 0x%08X\n", expected_type)); +#endif + if (objid != ico_object_id) mmo_read_category(data); + DBG(("mmo_read_object", "Category : %s\n", + data->category ? data->category : "[No category]")); } if (objid == cat_object_id) ; /* do nothing */ @@ -864,7 +968,7 @@ mmo_read(void) DBG((sobj, "number of objects = %d\n", mmo_obj_ct)); i = gbfgetuint16(fin); - if (i != 0xFFFF) fatal(MYNAME ": Marker not equel to 0xFFFF!\n"); + if (i != 0xFFFF) fatal(MYNAME ": Marker not equal to 0xFFFF!\n"); mmo_version = gbfgetuint16(fin); DBG((sobj, "version = 0x%02X\n", mmo_version)); @@ -944,7 +1048,8 @@ mmo_write_obj_mark(const char *sobj, const char *name) mmo_object_id++; snprintf(buf, sizeof(buf), "%u", mmo_object_id); - DBG(("write", "object \"%s\" registered (id = 0x%04X)\n", name, mmo_object_id)); + DBG(("write", "object \"%s\", registered type \"%s\" (id = 0x%04X)\n", + name, sobj, mmo_object_id)); avltree_insert(mmobjects, sobj, xstrdup(buf)); @@ -980,7 +1085,7 @@ mmo_write_category(const char *sobj, const char *name) static int mmo_write_obj_head(const char *sobj, const char *name, const time_t ctime, - const gpsdata_type type) + const gbuint32 obj_type) { int res; @@ -992,13 +1097,7 @@ mmo_write_obj_head(const char *sobj, const char *name, const time_t ctime, gbfputc(*opt_locked, fout); gbfputc(*opt_visible, fout); - switch(type) { - case trkdata: gbfputuint16(0x1E, fout); break; - case wptdata: gbfputuint16(0x3C, fout); break; - case rtedata: gbfputuint16(0x14, fout); break; - default: gbfputuint16(type, fout); break; - } - gbfputuint16(0x00, fout); + gbfputuint32(obj_type, fout); return res; } @@ -1032,7 +1131,7 @@ mmo_write_wpt_cb(const waypoint *wpt) DBG(("write", "waypoint \"%s\"\n", wpt->shortname ? wpt->shortname : "Mark")); objid = mmo_write_obj_head("CObjWaypoint", - (wpt->shortname && *wpt->shortname) ? wpt->shortname : "Mark", time, wptdata); + (wpt->shortname && *wpt->shortname) ? wpt->shortname : "Mark", time, obj_type_wpt); data = mmo_register_object(objid, wpt, wptdata); data->refct = 1; mmo_write_category("CCategory", (mmo_datatype == rtedata) ? "Waypoints" : "Marks"); @@ -1115,7 +1214,7 @@ mmo_write_rte_head_cb(const route_head *rte) if (time == 0x7FFFFFFF) time = gpsbabel_time; objid = mmo_write_obj_head("CObjRoute", - (rte->rte_name && *rte->rte_name) ? rte->rte_name : "Route", time, rtedata); + (rte->rte_name && *rte->rte_name) ? rte->rte_name : "Route", time, obj_type_rte); mmo_register_object(objid, rte, rtedata); mmo_write_category("CCategory", "Route"); gbfputc(0, fout); /* unknown */ @@ -1163,7 +1262,7 @@ mmo_write_trk_head_cb(const route_head *trk) if (trk->rte_waypt_ct <= 0) return; objid = mmo_write_obj_head("CObjTrack", - (trk->rte_name && *trk->rte_name) ? trk->rte_name : "Track", gpsbabel_time, trkdata); + (trk->rte_name && *trk->rte_name) ? trk->rte_name : "Track", gpsbabel_time, obj_type_trk); mmo_write_category("CCategory", "Track"); gbfputuint16(trk->rte_waypt_ct, fout); @@ -1252,7 +1351,7 @@ mmo_write(void) gbfputuint16(mmo_obj_ct, fout); - mmo_write_obj_head("CObjIcons", "Unnamed object", gpsbabel_time, 0); + mmo_write_obj_head("CObjIcons", "Unnamed object", gpsbabel_time, obj_type_ico); for (i = 0; i < 5; i++) gbfputuint16(0, fout); mmo_datatype = wptdata; diff --git a/reference/memory-map_v24.mmo b/reference/memory-map_v24.mmo new file mode 100644 index 0000000000000000000000000000000000000000..e69c4cea7097361d7b8cd087fca37fe278bb6451 GIT binary patch literal 25013 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 Ik68Er11^qnZ~y=R literal 0 HcmV?d00001 diff --git a/reference/memory-map_v24~mmo.gpx b/reference/memory-map_v24~mmo.gpx new file mode 100644 index 000000000..9613bce2b --- /dev/null +++ b/reference/memory-map_v24~mmo.gpx @@ -0,0 +1,2781 @@ + + + + + + Uttoxeter to Dimmingsdale + + + Uttoxeter Travelodge + SampleIcon + + + + WP0102 + Dot + + + + WP0103 + Dot + + + + WP0104 + Dot + + + + WP0105 + Dot + + + + WP0106 + Dot + + + + WP0107 + Dot + + + + WP0108 + Dot + + + + WP0109 + Dot + + + + WP0110 + Dot + + + + WP0111 + Dot + + + + WP0112 + Dot + + + + WP0113 + Dot + + + + WP0114 + Dot + + + + WP0115 + Dot + + + + WP0116 + Dot + + + + WP0117 + Dot + + + + WP0118 + Dot + + + + WP0119 + Dot + + + + WP0120 + Dot + + + + WP0121 + Dot + + + + WP0122 + Dot + + + + WP0123 + Dot + + + + WP0124 + Dot + + + + WP0125 + Dot + + + + WP0126 + Dot + + + + WP0127 + Dot + + + + WP0128 + Dot + + + + WP0129 + Dot + + + + WP0130 + Dot + + + + WP0131 + Dot + + + + WP0132 + Dot + + + + WP0133 + Dot + + + + WP0134 + Dot + + + + WP0135 + Dot + + + + WP0136 + Dot + + + + WP0137 + Dot + + + + WP0138 + Dot + + + + WP0139 + Dot + + + + WP0140 + Dot + + + + WP0141 + Dot + + + + WP0142 + Dot + + + + WP0143 + Dot + + + + WP0144 + Dot + + + + WP0145 + Dot + + + + WP0146 + Dot + + + + WP0148 + Dot + + + + WP0149 + Dot + + + + WP0150 + Dot + + + + WP0151 + Dot + + + + WP0152 + Dot + + + + WP0153 + Dot + + + + WP0154 + Dot + + + + WP0179 + Dot + + + + WP0178 + Dot + + + + WP0177 + Dot + + + + WP0176 + Dot + + + + WP0175 + Dot + + + + WP0174 + Dot + + + + WP0173 + Dot + + + + WP0172 + Dot + + + + WP0171 + Dot + + + + WP0170 + Dot + + + + WP0169 + Dot + + + + WP0168 + Dot + + + + WP0167 + Dot + + + + WP0166 + Dot + + + + WP0165 + Dot + + + + WP0164 + Dot + + + + WP0163 + Dot + + + + WP0162 + Dot + + + + WP0161 + Dot + + + + WP0160 + Dot + + + + WP0159 + Dot + + + + WP0158 + Dot + + + + WP0157 + Dot + + + + WP0156 + Dot + + + + WP0155 + Dot + + + + WP00126 + Dot + + + + WP00125 + Dot + + + + WP00124 + Dot + + + + WP00123 + Dot + + + + WP00122 + Dot + + + + WP00121 + Dot + + + + WP00120 + Dot + + + + WP00119 + Dot + + + + WP00118 + Dot + + + + WP00117 + Dot + + + + WP00116 + Dot + + + + WP00115 + Dot + + + + WP00114 + Dot + + + + WP00113 + Dot + + + + WP00112 + Dot + + + + WP00111 + Dot + + + + WP00110 + Dot + + + + WP00109 + Dot + + + + WP00108 + Dot + + + + WP00107 + Dot + + + + WP00106 + Dot + + + + WP00105 + Dot + + + + WP00104 + Dot + + + + WP00103 + Dot + + + + WP00102 + Dot + + + + WP00101 + Dot + + + + WP00100 + Dot + + + + WP0099 + Dot + + + + WP0098 + Dot + + + + WP0097 + Dot + + + + WP0096 + Dot + + + + WP0095 + Dot + + + + WP0094 + Dot + + + + WP0093 + Dot + + + + WP0092 + Dot + + + + WP0091 + Dot + + + + WP0090 + Dot + + + + WP0089 + Dot + + + + WP0088 + Dot + + + + WP0087 + Dot + + + + WP0086 + Dot + + + + WP0085 + Dot + + + + WP0084 + Dot + + + + WP0083 + Dot + + + + WP0082 + Dot + + + + WP0249 + Dot + + + + WP0248 + Dot + + + + WP0147 + Flag + + + + Uttoxeter Link + + + Uttoxeter Station + Flag + + + + WP0002 + Dot + + + + WP0003 + Dot + + + + WP0004 + Dot + + + + WP0005 + Dot + + + + WP0006 + Dot + + + + WP0007 + Dot + + + + WP0008 + Dot + + + + WP0009 + Dot + + + + WP0010 + Dot + + + + WP0011 + Dot + + + + WP0012 + Dot + + + + WP0013 + Dot + + + + WP0014 + Dot + + + + WP0015 + Dot + + + + WP0016 + Dot + + + + WP0017 + Dot + + + + WP0018 + Dot + + + + WP0019 + Dot + + + + WP0020 + Dot + + + + WP0021 + Dot + + + + WP0022 + Dot + + + + WP0023 + Dot + + + + WP0024 + Dot + + + + WP0025 + Dot + + + + WP0026 + Dot + + + + WP0027 + Dot + + + + WP0028 + Dot + + + + WP0029 + Dot + + + + WP0030 + Dot + + + + WP0031 + Dot + + + + WP0032 + Dot + + + + WP0033 + Dot + + + + Uttoxeter Travelodge + SampleIcon + + + + Uttoxeter to Dimmingsdale Track + + + 136.000000 + + + + 138.500000 + + + + 153.000000 + + + + 152.500000 + + + + 145.500000 + + + + 136.500000 + + + + 136.500000 + + + + 133.500000 + + + + 132.500000 + + + + 133.000000 + + + + 132.000000 + + + + 132.500000 + + + + 133.000000 + + + + 136.500000 + + + + 136.000000 + + + + 138.500000 + + + + 138.000000 + + + + 135.500000 + + + + 135.500000 + + + + 134.500000 + + + + 135.000000 + + + + 124.000000 + + + + 135.500000 + + + + 138.500000 + + + + 138.500000 + + + + 136.500000 + + + + 141.500000 + + + + 145.000000 + + + + 142.500000 + + + + 142.000000 + + + + 142.500000 + + + + 143.500000 + + + + 144.500000 + + + + 145.500000 + + + + 143.500000 + + + + 145.000000 + + + + 146.500000 + + + + 145.000000 + + + + 148.500000 + + + + 147.500000 + + + + 149.500000 + + + + 147.000000 + + + + 144.500000 + + + + 141.000000 + + + + 142.500000 + + + + 140.000000 + + + + 145.500000 + + + + 149.500000 + + + + 151.000000 + + + + 151.500000 + + + + 151.500000 + + + + 151.500000 + + + + 147.000000 + + + + 146.000000 + + + + 146.500000 + + + + 147.500000 + + + + 149.000000 + + + + 148.500000 + + + + 148.000000 + + + + 147.500000 + + + + 148.000000 + + + + 147.000000 + + + + 150.000000 + + + + 147.500000 + + + + 145.500000 + + + + 145.000000 + + + + 143.500000 + + + + 142.000000 + + + + 141.000000 + + + + 141.000000 + + + + 141.500000 + + + + 140.500000 + + + + 140.500000 + + + + 139.500000 + + + + 138.500000 + + + + 137.500000 + + + + 137.500000 + + + + 137.500000 + + + + 137.000000 + + + + 137.000000 + + + + 136.500000 + + + + 136.000000 + + + + 135.500000 + + + + 135.000000 + + + + 134.500000 + + + + 135.000000 + + + + 134.500000 + + + + 134.500000 + + + + 134.500000 + + + + 134.500000 + + + + 134.500000 + + + + 134.000000 + + + + 131.500000 + + + + 130.500000 + + + + 131.000000 + + + + 132.500000 + + + + 135.500000 + + + + 137.500000 + + + + 138.500000 + + + + 138.500000 + + + + 138.000000 + + + + 138.000000 + + + + 136.500000 + + + + 134.000000 + + + + 134.000000 + + + + 135.500000 + + + + 135.500000 + + + + 137.000000 + + + + 137.000000 + + + + 137.000000 + + + + 138.000000 + + + + 138.000000 + + + + 138.500000 + + + + 139.500000 + + + + 141.500000 + + + + 141.500000 + + + + 140.500000 + + + + 140.500000 + + + + 141.000000 + + + + 140.500000 + + + + 140.000000 + + + + 140.000000 + + + + 140.000000 + + + + 141.000000 + + + + 140.000000 + + + + 139.000000 + + + + 138.000000 + + + + 138.500000 + + + + 137.500000 + + + + 138.000000 + + + + 138.500000 + + + + 139.500000 + + + + 139.500000 + + + + 142.000000 + + + + 144.500000 + + + + 147.000000 + + + + 146.500000 + + + + 145.000000 + + + + 141.000000 + + + + 140.000000 + + + + 140.500000 + + + + 144.000000 + + + + 143.500000 + + + + 143.000000 + + + + 141.000000 + + + + 140.000000 + + + + 140.000000 + + + + 140.000000 + + + + 141.000000 + + + + 143.500000 + + + + 145.000000 + + + + 148.000000 + + + + 145.000000 + + + + 145.000000 + + + + 144.500000 + + + + 144.000000 + + + + 143.500000 + + + + 143.500000 + + + + 144.500000 + + + + 143.500000 + + + + 140.500000 + + + + 138.500000 + + + + 138.000000 + + + + 138.500000 + + + + 138.500000 + + + + 137.500000 + + + + 138.000000 + + + + 138.500000 + + + + 138.500000 + + + + 139.000000 + + + + 139.000000 + + + + 139.500000 + + + + 139.000000 + + + + 140.000000 + + + + 140.000000 + + + + 141.000000 + + + + 141.500000 + + + + 143.000000 + + + + 143.000000 + + + + 144.000000 + + + + 143.500000 + + + + 143.000000 + + + + 142.500000 + + + + 143.000000 + + + + 143.000000 + + + + 143.000000 + + + + 143.500000 + + + + 144.000000 + + + + 144.000000 + + + + 144.000000 + + + + 144.500000 + + + + 145.000000 + + + + 144.000000 + + + + 144.000000 + + + + 143.500000 + + + + 143.500000 + + + + 144.500000 + + + + 145.000000 + + + + 145.000000 + + + + 145.500000 + + + + 147.000000 + + + + 147.000000 + + + + 147.000000 + + + + 148.000000 + + + + 147.000000 + + + + 146.000000 + + + + 145.000000 + + + + 146.500000 + + + + 151.500000 + + + + 148.500000 + + + + 149.500000 + + + + 148.000000 + + + + 147.500000 + + + + 148.000000 + + + + 148.500000 + + + + 151.000000 + + + + 154.000000 + + + + 158.500000 + + + + 157.500000 + + + + 157.500000 + + + + 154.500000 + + + + 156.500000 + + + + 152.000000 + + + + 148.500000 + + + + 149.000000 + + + + 149.500000 + + + + 151.500000 + + + + 157.500000 + + + + 163.000000 + + + + 170.000000 + + + + 176.500000 + + + + 178.500000 + + + + 175.500000 + + + + 169.500000 + + + + 161.500000 + + + + 157.500000 + + + + 158.000000 + + + + 149.500000 + + + + 140.500000 + + + + 137.500000 + + + + 132.500000 + + + + 128.000000 + + + + 123.000000 + + + + 122.500000 + + + + 125.500000 + + + + 122.500000 + + + + 117.000000 + + + + 105.000000 + + + + 113.000000 + + + + 127.500000 + + + + 130.000000 + + + + 138.500000 + + + + 140.500000 + + + + 149.500000 + + + + 158.500000 + + + + 162.000000 + + + + 167.000000 + + + + 166.500000 + + + + 159.500000 + + + + 135.500000 + + + + 132.500000 + + + + 132.000000 + + + + 138.500000 + + + + 149.000000 + + + + 145.500000 + + + + 145.500000 + + + + 145.500000 + + + + 143.500000 + + + + 141.500000 + + + + 142.000000 + + + + 146.500000 + + + + 143.500000 + + + + 143.000000 + + + + 146.500000 + + + + 152.500000 + + + + 167.500000 + + + + 177.000000 + + + + 182.500000 + + + + 184.000000 + + + + 188.500000 + + + + 185.000000 + + + + 186.500000 + + + + 174.500000 + + + + 172.500000 + + + + 157.000000 + + + + 142.500000 + + + + 119.000000 + + + + 115.500000 + + + + 113.000000 + + + + 126.500000 + + + + 128.500000 + + + + 144.500000 + + + + 146.000000 + + + + 153.000000 + + + + 171.500000 + + + + 178.500000 + + + + 184.500000 + + + + 185.500000 + + + + 181.000000 + + + + 181.500000 + + + + 174.000000 + + + + 137.500000 + + + + 131.000000 + + + + 123.000000 + + + + 145.000000 + + + + 156.000000 + + + + 154.500000 + + + + 151.500000 + + + + 152.500000 + + + + 151.500000 + + + + 151.500000 + + + + 153.000000 + + + + 154.500000 + + + + 150.500000 + + + + 157.000000 + + + + 160.500000 + + + + 162.000000 + + + + 163.000000 + + + + 162.500000 + + + + 164.000000 + + + + 159.500000 + + + + 156.000000 + + + + 156.500000 + + + + 156.000000 + + + + 154.500000 + + + + 153.500000 + + + + 150.500000 + + + + 159.500000 + + + + 166.500000 + + + + 167.500000 + + + + 168.000000 + + + + 165.500000 + + + + 165.500000 + + + + 162.500000 + + + + 159.000000 + + + + 155.500000 + + + + 148.500000 + + + + 152.000000 + + + + 150.500000 + + + + 150.500000 + + + + 152.000000 + + + + 152.500000 + + + + 152.000000 + + + + 151.500000 + + + + 152.500000 + + + + 153.500000 + + + + 149.500000 + + + + 144.000000 + + + + 144.000000 + + + + 139.000000 + + + + 136.000000 + + + + 132.000000 + + + + 127.000000 + + + + 118.500000 + + + + 114.000000 + + + + 108.500000 + + + + 107.500000 + + + + 104.500000 + + + + 94.500000 + + + + 106.500000 + + + + 114.000000 + + + + 121.000000 + + + + 123.000000 + + + + 134.000000 + + + + 147.500000 + + + + 150.000000 + + + + 148.000000 + + + + 140.000000 + + + + 130.000000 + + + + 127.000000 + + + + 119.500000 + + + + 112.000000 + + + + 104.500000 + + + + 98.000000 + + + + 95.500000 + + + + 88.500000 + + + + 95.500000 + + + + 114.500000 + + + + 102.000000 + + + + 94.500000 + + + + 96.500000 + + + + 92.500000 + + + + 94.000000 + + + + 96.000000 + + + + 96.500000 + + + + 106.500000 + + + + 118.000000 + + + + 116.000000 + + + + 115.000000 + + + + 106.000000 + + + + 97.500000 + + + + 93.500000 + + + + 87.500000 + + + + 81.500000 + + + + 77.000000 + + + + 73.500000 + + + + 75.000000 + + + + 75.000000 + + + + 76.000000 + + + + 76.500000 + + + + 77.500000 + + + + 79.000000 + + + + 86.500000 + + + + 94.500000 + + + + 117.500000 + + + + 134.500000 + + + + 165.500000 + + + + 165.000000 + + + + 163.000000 + + + + 167.500000 + + + + 160.000000 + + + + 156.000000 + + + + 154.500000 + + + + 157.500000 + + + + 164.000000 + + + + 166.500000 + + + + 166.000000 + + + + 163.000000 + + + + 160.500000 + + + + 163.500000 + + + + 164.000000 + + + + 161.500000 + + + + 165.000000 + + + + 168.500000 + + + + 171.500000 + + + + 170.500000 + + + + 173.000000 + + + + 178.500000 + + + + 182.000000 + + + + 185.500000 + + + + 186.500000 + + + + 186.000000 + + + + 182.000000 + + + + 186.500000 + + + + 190.500000 + + + + 195.500000 + + + + 200.500000 + + + + 198.500000 + + + + 200.000000 + + + + 203.500000 + + + + 207.000000 + + + + 207.000000 + + + + 205.500000 + + + + 203.000000 + + + + 203.500000 + + + + 199.500000 + + + + 199.000000 + + + + 200.000000 + + + + 196.500000 + + + + 198.500000 + + + + 194.000000 + + + + 191.500000 + + + + 191.000000 + + + + 195.000000 + + + + 193.500000 + + + + 192.500000 + + + + 192.500000 + + + + 191.500000 + + + + 188.500000 + + + + 189.000000 + + + + 187.500000 + + + + 188.500000 + + + + 193.000000 + + + + 205.000000 + + + + 205.500000 + + + + 204.500000 + + + + 204.500000 + + + + 204.000000 + + + + 206.000000 + + + + 207.500000 + + + + 208.000000 + + + + 209.000000 + + + + 207.000000 + + + + 203.500000 + + + + 200.000000 + + + + 200.500000 + + + + 220.500000 + + + + 227.500000 + + + + 243.000000 + + + + 241.000000 + + + + 241.500000 + + + + 240.000000 + + + + 244.500000 + + + + 241.000000 + + + + 233.500000 + + + + 248.000000 + + + + 256.000000 + + + + 251.500000 + + + + 247.000000 + + + + 246.500000 + + + + + diff --git a/testo.d/classic-4.test b/testo.d/classic-4.test index 001534e93..ee463af5a 100755 --- a/testo.d/classic-4.test +++ b/testo.d/classic-4.test @@ -270,9 +270,12 @@ compare ${REFERENCE}/track/tcxtest~gpx-history.tcx ${TMPDIR}/tcxtest~gpx-history # # Memory-Map Navigator overlay files (.mmo) # -# reading +# reading version 22 (0x16) gpsbabel -i mmo -f ${REFERENCE}/memory-map.mmo -o gpx -F ${TMPDIR}/memory-map~mmo.gpx compare ${REFERENCE}/memory-map~mmo.gpx ${TMPDIR}/memory-map~mmo.gpx +# reading version 24 (0x18) +gpsbabel -i mmo -f ${REFERENCE}/memory-map_v24.mmo -o gpx -F ${TMPDIR}/memory-map_v24~mmo.gpx +compare ${REFERENCE}/memory-map_v24~mmo.gpx ${TMPDIR}/memory-map_v24~mmo.gpx #writing (check only for memory leaks) gpsbabel -i gpx -f ${REFERENCE}/memory-map~mmo.gpx -o mmo -F ${TMPDIR}/memory-map~mmo.mmo gpsbabel -i mmo -f ${TMPDIR}/memory-map~mmo.mmo -o gpx -F ${TMPDIR}/memory-map~mmo~gpx.mmo -- 2.30.2